#ifndef VECTOR_H
#define VECTOR_H
#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>

/* 宏定义部分 */
// 检查vector指针和数据指针是否有效
#define vector_valid(vector) ((vector) != NULL && (vector)->data != NULL)

// 检查索引是否在有效范围内
#define vector_valid_index(vector, index) ((vector) != NULL && (index) < (vector)->size)

// 安全访问元素，无效索引返回NULL
#define vector_at(vector, index) (vector_valid_index(vector, index) ? (vector)->data[(index)] : NULL)

// 判断vector是否为空
#define vector_empty(vector) ((vector) == NULL || (vector)->size == 0)

// 获取末尾元素
#define vector_back(vector) (vector_empty(vector) ? NULL : (vector)->data[(vector)->size - 1])

// 获取首元素
#define vector_front(vector) (vector_empty(vector) ? NULL : (vector)->data[0])

// 获取当前元素数量
#define vector_size(vector) ((vector) != NULL ? (vector)->size : 0)

// 获取起始迭代器
#define vector_begin(vector) (vector_valid(vector) ? (vector)->data : NULL)

// 获取结束迭代器(指向最后一个元素的下一个位置)
#define vector_end(vector) (vector_valid(vector) ? (vector)->data + (vector)->size : NULL)

// 获取当前容量
#define vector_capacity(vector) ((vector) != NULL ? (vector)->capacity : 0)

/* 类型定义 */
typedef void** VECTOR_ITERATOR; // 迭代器类型定义

// Vector结构体定义
typedef struct {
    void** data;
    size_t size, capacity, type;
} VECTOR;

/* 函数声明 */
// 创建新vector，参数为初始容量
VECTOR* vector_new(size_t);

// 内部删除函数(实际释放内存)
void _vector_del(VECTOR*);
// 安全删除vector的宏(自动置NULL)
#define vector_del(vector) \
    do { \
        if (vector) { \
            _vector_del(vector); \
            vector = NULL; \
        } \
    } while (0)

// 清空vector(保留内存)
void vector_clear(VECTOR*);

// 查找元素，返回索引或SIZE_MAX表示未找到
size_t vector_find(const VECTOR*, const void*);

// 删除末尾元素
void vector_pop(VECTOR*);

// 添加元素到末尾
void vector_push(VECTOR*, const void*);

// 调整容量，成功返回true
bool vector_resize(VECTOR*, size_t);

// 删除指定位置的元素，返回下一个有效迭代器
VECTOR_ITERATOR vector_erase(VECTOR*, VECTOR_ITERATOR);

// 在指定位置插入元素，返回插入位置的迭代器
VECTOR_ITERATOR vector_insert(VECTOR*, const void*, VECTOR_ITERATOR);

#endif  // VECTOR_H